dnl $Id: configure.ac 41 2012-04-01 18:26:10Z dubkat $
dnl Process this file with autoconf to produce a configure script.

dnl TODO: clean up all the OpenSSL and shared module checking stuff;
dnl the most major changes have already been made and it looks like
dnl said functions need to be just about as complex as they already are.

AC_PREREQ([2.63])
AC_CONFIG_MACRO_DIR([m4])

dnl Sneaky way to get an Id tag into the configure script
AC_COPYRIGHT([$Id: configure.ac 41 2012-04-01 18:26:10Z dubkat $])
AC_INIT([ratbox-monitor], [0.0.1-devel], [http://code.google.com/p/ratbox-monitor/issues/list], [], [http://ratbox-monitor.googlecode.com/])

AC_CONFIG_SUBDIRS(libraries/sqlite libraries/libpcre libraries/libconfig libraries/libcares libraries/libratbox)

AC_CANONICAL_TARGET
AC_CANONICAL_HOST
AC_CANONICAL_BUILD

AM_MAINTAINER_MODE
AM_INIT_AUTOMAKE([1.10 foreign subdir-objects color-tests no-installinfo no-installman -Wall -Werror])
AM_CONFIG_HEADER([include/setup.h])




AC_DEFINE_UNQUOTED([CHOST], ["$host"], [Canonical host])
AC_DEFINE_UNQUOTED([CBUILD], ["$build"], [Canonical build])
AC_DEFINE_UNQUOTED([CTARGET], ["$target"], [Canonical target])



AC_PREFIX_DEFAULT([/usr/local/ratbox-monitor])
AC_GNU_SOURCE

dnl Checks for programs.
AC_PATH_PROG(CP, cp)
AC_PATH_PROG(MV, mv)
AC_PATH_PROG(RB_RM, rm)


AC_PROG_CC_C99

if test x"$ac_cv_prog_cc_c99" = "xno"; then
	AC_ERROR([ratbox-monitor requires a C99 capable compiler])
fi


AM_PROG_LEX

AC_PROG_INSTALL
AC_PROG_EGREP
if test "$enable_static" = "yes"; then
	AM_DISABLE_SHARED
	AM_ENABLE_STATIC	
        AC_DEFINE([STATIC_MODULES], 1, [Define to 1 if dynamic modules cant be used.])
else
	enable_static="no"
fi

F77=no
GCJ=no

dnl AC_LIBLTDL_CONVENIENCE
dnl AC_SUBST(INCLTDL)
dnl AC_SUBST(LIBLTDL)
AC_LIBTOOL_DLOPEN
AM_PROG_CC_C_O
AM_DISABLE_STATIC
AM_ENABLE_SHARED
AM_MAINTAINER_MODE

AC_ISC_POSIX
AC_C_INLINE
AC_PROG_GCC_TRADITIONAL
AC_PROG_MAKE_SET
AC_PROG_INSTALL
AC_PROG_YACC

srcpwd=`cd ${srcdir} ; ${PWDCMD-pwd}`

dnl We pase INSTALL explicitly to sub-makes.  Make sure that it is not
dnl a relative path.

if test "$INSTALL" = "${srcdir}/install-sh -c"; then
  INSTALL="${srcpwd}/install-sh -c"
fi

AC_LANG(C)

AM_CONDITIONAL([STATIC_MODULES], test "$enable_static" = "yes")
AC_PROG_LIBTOOL

cc_accepts_flag()
{
	cc_accepts_flag_CFLAGS="$CFLAGS"
	CFLAGS="$*"
	AC_MSG_CHECKING([whether $CC accepts $@])
	AC_COMPILE_IFELSE(
	   [
	       AC_LANG_SOURCE([int main(){return 0;}])
	   ],
	   [
	       RC=0; AC_MSG_RESULT([yes])
	   ],
	   [
	       RC=1; AC_MSG_RESULT([no])
	   ]
	)
	   
	CFLAGS="$cc_accepts_flag_CFLAGS"
	return $RC
}

if cc_accepts_flag -fno-strict-aliasing; then
	CFLAGS="$CFLAGS -fno-strict-aliasing"
fi

if cc_accepts_flag -fstack-protector; then
    CFLAGS="$CFLAGS -fstack-protector"
fi

if cc_accepts_flag -fstack-protector-all; then
    CFLAGS="$CFLAGS -fstack-protector-all"
fi

WARNLIST="  
	all  
	cast-qual
	format
	no-format-security
	missing-declarations
	missing-prototypes
	nested-externs
	shadow
	write-strings
	no-unused
	unused-function
	unused-variable" 

for x in $WARNLIST; do 
	if cc_accepts_flag -W$x; then
		WARNFLAGS="$WARNFLAGS -W$x";
	fi
done

LIBTOOL="$LIBTOOL --silent"




case "$host_os" in
*cygwin*)
     AC_DEFINE_UNQUOTED(CYGWIN,1,[This is a Cygwin system])
     AC_DEFINE_UNQUOTED(WINDOWS,1,[This is a Windows system])
     ;;
*mingw*)
     AC_DEFINE_UNQUOTED(MINGW,1,[This is a MinGW system])
     AC_DEFINE_UNQUOTED(WINDOWS,1,[This is a Windows system])
     AC_CHECK_HEADER(winsock2.h, , [AC_MSG_ERROR([** MinGW and no winsock2.h.  I give up.])])
     LIBS="$LIBS -lws2_32 -liphlpapi"
     is_mingw="yes"
     ;;
*)
     ;;
esac

AM_CONDITIONAL([MINGW], [test "$is_mingw" = "yes"])

if test "$LEX" != flex; then
  LEX="$SHELL $missing_dir/missing flex"
  AC_SUBST(LEX_OUTPUT_ROOT, lex.yy)
  AC_SUBST(LEXLIB, '')
fi

dnl backwards support for IRC_CFLAGS
CFLAGS="$IRC_CFLAGS $CFLAGS"

dnl Checks for header files.
AC_HEADER_STDC

AC_HEADER_SYS_WAIT
AC_HEADER_DIRENT

AC_CHECK_HEADERS([ sys/types.h sys/resource.h sys/param.h sys/stat.h sys/socket.h netinet/in.h arpa/inet.h errno.h stddef.h ])
AC_HEADER_TIME

AC_CHECK_FUNCS([snprintf])

dnl Networking Functions
dnl ====================

AC_SEARCH_LIBS(socket, [socket],,)

dnl this gets passed on to the libratbox configure
AC_ARG_ENABLE(ipv6,AC_HELP_STRING([--disable-ipv6],[Disable IPv6 support (not recommended)]),[ipv6=$enableval],[ipv6=yes])

AC_ARG_ENABLE(openmp,AC_HELP_STRING([--disable-openmp],[Disable parallel processing in some cases]),[openmp=$enableval],[openmp=yes])

AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug], [Enable a build suitable for debugging]), [debug=$enableval],[debug=no])

if test x"$debug" != "xno"; then
    CFLAGS="$CFLAGS -DEBUG -O0 -ggdb3"
    if cc_accepts_flag -nopie; then
        CFLAGS="$CFLAGS -nopie"
    fi
fi

dnl See whether we can include both string.h and strings.h.
AC_CACHE_CHECK(
    [whether string.h and strings.h may both be included],
    gcc_cv_header_string,
    [
    	AC_COMPILE_IFELSE(
    	[ 
    	   AC_LANG_SOURCE
    	   ([[
    	       #include <string.h>
	           #include <strings.h>
	       ]])
	    ], 
	    [gcc_cv_header_string=yes],
	    [gcc_cv_header_string=no])
    ]
)

if test "$gcc_cv_header_string" = "yes"; then
	AC_DEFINE(STRING_WITH_STRINGS, 1, [Define to 1 if string.h may be included along with strings.h])
fi

AC_C_BIGENDIAN

dnl Check for stdarg.h - if we can't find it, halt configure
AC_CHECK_HEADER(stdarg.h, , [AC_MSG_ERROR([** stdarg.h could not be found - ircd-ratbox will not compile without it **])])


if test "x$openmp" = "xyes"; then
    AC_CHECK_HEADER(omp.h, , [AC_MSG_ERROR([** OpenMP is not installed. Consider upgrading your libc or using --disable-openmp **])])
    AC_DEFINE(HAVE_OPENMP, 1, [Define to 1 if we can use OpenMP])
    CFLAGS="$CFLAGS -fopenmp"
fi


AC_FUNC_ALLOCA


dnl Specialized functions checks
dnl ============================



cf_libratbox_headers="libraries/libratbox/include"
cf_libconfig_headers="libraries/libconfig/lib"
cf_libcares_headers="libraries/libcares"
cf_libpcre_headers="libraries/libpcre"
cf_libsqlite_headers="libraries/sqlite"

AC_CHECK_HEADER(${cf_libcares_headers}/ares.h, [AC_MSG_ERROR([ ** ares.h could not be found. ** ]) ])
AC_CHECK_HEADER(${cf_libconfig_headers}/libconfig.h, [AC_MSG_ERROR([ ** libconfig.h could not be found. ** ]) ])
AC_CHECK_HEADER(${cf_libratbox_headers}/ratbox_lib.h , [AC_MSG_ERROR([** ratbox_lib.h could not be found. ** ]) ])
AC_CHECK_HEADER(${cf_libpcre_headers}/pcre.h, [AC_MSG_ERROR([ ** pcre.h could not be found. ** ]) ])
AC_CHECK_HEADER(${cf_libsqlite_headers}/sqlite3.h, [AC_MSG_ERROR([ ** sqlite3.h could not be found. ** ]) ])

CFLAGS="$CFLAGS -I$cf_libratbox_headers -I$cf_libcares_headers -I$cf_libconfig_headers -I$cf_libpcre_headers -I$cf_libsqlite_headers"

dnl LIBS="$LIBS -L$cf_libconfig_headers"

dnl OpenSSL support
dnl AC_MSG_CHECKING(for OpenSSL)
dnl AC_ARG_ENABLE(openssl,
dnl [AC_HELP_STRING([--enable-openssl[=DIR]],[Enable OpenSSL support (DIR optional).])
dnl AC_HELP_STRING([--disable-openssl],[Disable OpenSSL support.])],
dnl [cf_enable_openssl=$enableval],
dnl [cf_enable_openssl="auto"])
dnl 
dnl if test "$cf_enable_openssl" != "no" ; then
dnl 	cf_openssl_basedir=""
dnl 	if test "$cf_enable_openssl" != "auto" &&
dnl 	test "$cf_enable_openssl" != "yes" ; then
dnl 		dnl Support for --enable-openssl=/some/place
dnl 		cf_openssl_basedir="`echo ${cf_enable_openssl} | sed 's/\/$//'`"
dnl 	else
dnl 	dnl Do the auto-probe here.  Check some common directory paths.
dnl 		for dirs in /usr/local/ssl /usr/pkg /usr/local \
dnl 		/usr/local/openssl ; do
dnl 			if test -f "${dirs}/include/openssl/opensslv.h" ; then
dnl 				cf_openssl_basedir="${dirs}"
dnl 			break
dnl 			fi
dnl 		done
dnl 		unset dirs
dnl 	fi
dnl 	dnl Now check cf_openssl_found to see if we found anything.
dnl 	if test ! -z "$cf_openssl_basedir"; then
dnl 		if test -f "${cf_openssl_basedir}/include/openssl/opensslv.h" ; then
dnl 			SSL_INCLUDES="-I${cf_openssl_basedir}/include"
dnl 			SSL_LIBS="-L${cf_openssl_basedir}/lib $lt_cv_dlopen_libs"
dnl 		else
dnl 		dnl OpenSSL wasn't found in the directory specified.  Naughty
dnl 		dnl administrator...
dnl 		cf_openssl_basedir=""
dnl 		fi
dnl 	else
dnl 	dnl Check for stock FreeBSD 4.x and 5.x systems, since their files
dnl 	dnl are in /usr/include and /usr/lib.  In this case, we don't want to
dnl 	dnl change INCLUDES or LIBS, but still want to enable OpenSSL.
dnl 	dnl We can't do this check above, because some people want two versions
dnl 	dnl of OpenSSL installed (stock FreeBSD 4.x/5.x and /usr/local/ssl)
dnl 	dnl and they want /usr/local/ssl to have preference.
dnl 		if test -f "/usr/include/openssl/opensslv.h" ; then
dnl 			cf_openssl_basedir="/usr"
dnl 		fi
dnl 	fi
dnl 
dnl 	dnl If we have a basedir defined, then everything is okay.  Otherwise,
dnl 	dnl we have a problem.
dnl 	if test ! -z "$cf_openssl_basedir"; then
dnl 		AC_MSG_RESULT($cf_openssl_basedir)
dnl 		cf_enable_openssl="yes"
dnl 	else
dnl 		AC_MSG_RESULT([not found. Specify a correct path?])
dnl 		cf_enable_openssl="no"
dnl 	fi
dnl 	unset cf_openssl_basedir
dnl else
dnl 	dnl If --disable-openssl was specified
dnl 	AC_MSG_RESULT(disabled)
dnl fi
dnl 

save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $SSL_INCLUDES"
save_LIBS="$LIBS"
LIBS="$LIBS $SSL_LIBS"



if test "$cf_enable_openssl" != no; then
	dnl Check OpenSSL version (must be 0.9.7 or above!)
	AC_MSG_CHECKING([for OpenSSL 0.9.7 or above])
	AC_RUN_IFELSE(
        AC_LANG_PROGRAM(
            [#include <openssl/opensslv.h>
        #include <stdlib.h>],
        [[if (OPENSSL_VERSION_NUMBER >= 0x00907000)
        exit(0); else exit(1);]]),
    cf_enable_openssl=yes,
    cf_enable_openssl=no,
    cf_enable_openssl=no)

	if test "$cf_enable_openssl" = yes; then
		AC_MSG_RESULT(found)
	else
		cf_enable_openssl=no
		AC_MSG_RESULT(not found - OpenSSL support disabled)
	fi
fi

if test "$cf_openssl_version_ok" != no; then
	CPPFLAGS="$CPPFLAGS $SSL_LIBS"
	AC_CHECK_LIB(crypto, RSA_free, 
		[SSL_LIBS="$SSL_LIBS -lcrypto $lt_cv_dlopen_libs"], 
		[cf_enable_openssl=no]  
	)
fi

if test "$cf_enable_openssl" != no; then
	AC_DEFINE(USE_CHALLENGE, 1, [Define to enable CHALLENGE support, requires OpenSSL])
fi

CPPFLAGS="$save_CPPFLAGS"
LIBS="$save_LIBS"

dnl End OpenSSL detection



dnl Specialized functions and libraries
dnl ===================================

dnl AC_ARG_WITH(zlib-path,
dnl AC_HELP_STRING([--with-zlib-path=DIR],[Path to libz.so for ziplinks support.]),
dnl [LIBS="$LIBS -L$withval"],)


dnl AC_ARG_ENABLE(zlib,
dnl AC_HELP_STRING([--disable-zlib],[Disable ziplinks support]),
dnl [zlib=$enableval],[zlib=yes])
 
dnl if test "$zlib" = yes; then

dnl AC_CHECK_HEADER(zlib.h, [
dnl 	AC_CHECK_LIB(z, zlibVersion,
dnl 	[
dnl		AC_SUBST(ZLIB_LD, -lz)
dnl		AC_DEFINE(HAVE_ZLIB, 1, [Define to 1 if zlib (-lz) is available.])
dnl	], zlib=no)
dnl], zlib=no)
dnl fi


dnl Debug-related options
dnl =====================

AC_ARG_ENABLE(assert,
AC_HELP_STRING([--enable-assert],[Enable assert(). Choose between soft(warnings) and hard(aborts the daemon)]),
[assert=$enableval], [assert=no])

if test "$assert" = no; then
	AC_DEFINE(NDEBUG, 1, [Define this to disable debugging support.])
elif test "$assert" = soft; then
	AC_DEFINE(SOFT_ASSERT, 1, [Define this to enable soft asserts.])
	AC_DEFINE(NDEBUG, 1, [Define this to disable debugging support.])
elif test "$assert" = yes; then
	assert = "hard";
fi

dnl AC_MSG_CHECKING(if you want IO Debugging hooks)
dnl AC_ARG_ENABLE(iodebug,
dnl AC_HELP_STRING([--enable-iodebug],[Enable IO Debugging hooks]),
dnl [iodebug=$enableval], [iodebug=no])
dnl 
dnl if test "$iodebug" = yes; then
dnl 	AC_DEFINE(USE_IODEBUG_HOOKS, 1, [Define this to enable IO Debug hooks.])
dnl 	AC_MSG_RESULT(yes)
dnl else
dnl 	AC_MSG_RESULT(no)
dnl fi


AC_MSG_CHECKING(if you want to do a profile build)
AC_ARG_ENABLE(profile,
AC_HELP_STRING([--enable-profile],[Enable profiling]),
[profile=$enableval], [profile=no])

if test "$profile" = yes; then
	if test "$ac_cv_c_compiler_gnu" = yes; then
		CFLAGS="$CFLAGS -pg -static"
		AC_MSG_RESULT([yes, adding -pg -static])
		AC_DEFINE(RATBOX_PROFILE, 1, [Defined to mark profiling is enabled])
	else
		AC_MSG_RESULT([no, profile builds only work with gcc])
	fi
else
	AC_MSG_RESULT(no)
fi


dnl Server Tweaks
dnl =============


dnl AC_SUBST(SSL_INCLUDES)
dnl AC_SUBST(SSL_LIBS)
AC_SUBST(LDFLAGS)
AC_SUBST(PICFLAGS)
AC_SUBST(CFLAGS)
AC_SUBST(SEDOBJ)
AC_SUBST(WARNFLAGS)


if test "$prefix" = "NONE"; then 
	AC_DEFINE_UNQUOTED(MONITOR_PREFIX, "$ac_default_prefix", [Prefix where ratbox-monitor is installed.])

else

    dnl Don't get bitten by Cygwin's stupidity if the user specified
    dnl a custom prefix with a trailing slash

    prefix="`echo $prefix | sed 's/\/$//'`"
    AC_DEFINE_UNQUOTED(MONITOR_PREFIX, "$prefix", [Prefix where the ircd is installed.])
	
fi

if test "x$libexecdir" = "xNONE"; then
	rb_cv_libexecdir=$ac_default_libexecdir
else
	rb_cv_libexecdir=$libexecdir
fi

libexecdir=`eval "echo ${rb_cv_libexecdir}/ratbox-monitor"`
AC_DEFINE([LIBEXEC_DIR], libexecdir, [Prefix where to install non-user executables.])

dnl lets see what libtool thinks our suffix is...
AC_MSG_CHECKING([for shared library suffix])
dnl this whole thing is a big hack...
module=yes
eval SHLIBEXT=\"$shrext_cmds\"
AC_MSG_RESULT($SHLIBEXT)
AC_SUBST(SHLIBEXT,$SHLIBEXT)
AC_SUBST(LT_OBJDIR,$lt_cv_objdir)
AC_DEFINE_UNQUOTED(SHLIBEXT,"$SHLIBEXT", [Extension that shared libs use])
                   
AC_SUBST(MONITOR_PREFIX)

disable_backups=n
AC_ARG_ENABLE(backups,,disable_backups=y)
AM_CONDITIONAL([DISABLE_BACKUPS], [test x"$disable_backups" = "xy"])


AC_CONFIG_FILES(		\
	Makefile
)

AC_OUTPUT

dnl Make it look sexay!

echo
echo "Compiling $PACKAGE_NAME $PACKAGE_VERSION"
echo

echo "Installing into: $prefix"

dnl echo "Ziplinks ....................... $zlib"

dnl echo "OpenSSL ........................ $cf_enable_openssl"

tmpresult=shared

if test "x$enable_static" = "xyes"; then
	tmpresult=static
fi

echo "Build Flags .................... $CFLAGS"
echo "Build Type ..................... $tmpresult"
echo "Assert debugging ............... $assert"
echo "OpenMP Support ................. $openmp"
